package com.blkj.iam.common.util;

import net.sourceforge.pinyin4j.PinyinHelper;

import java.util.List;

/**
 * @description: 拼音工具类
 * @author: Ethan
 * @create: 2025-05-08
 **/
public class PinyinUtils {

    /**
     * 将中文字符串转换为拼音首字母缩写
     * 如果字符串中包含特殊符号，保留输出
     *
     * @param input 输入的中文字符串
     * @return 转换后的拼音首字母缩写
     */
    public static String toPinyinAbbreviation(String input) {
        if (input == null || input.isEmpty()) {
            return "";
        }

        StringBuilder result = new StringBuilder();
        char[] chars = input.toCharArray();

        for (char c : chars) {
            // 如果是特殊符号，直接添加到结果中
            if (!Character.isLetter(c) && !Character.isDigit(c)) {
                result.append(c);
                continue;
            }

            // 获取当前字符的拼音数组
            String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c);
            if (pinyinArray != null && pinyinArray.length > 0) {
                // 取拼音的第一个字母
                result.append(pinyinArray[0].charAt(0));
            } else {
                // 如果不是中文字符，直接添加到结果中
                result.append(c);
            }
        }

        return result.toString().toUpperCase();
    }

    /**
     * 过滤掉部门编码中不包含数字的数据
     *
     * @param deptCodes 部门编码列表
     * @param isRoot
     * @return 过滤后的部门编码列表
     */
    public static String filterDeptCodes(List<String> deptCodes, boolean isRoot) {
        if (deptCodes == null || deptCodes.isEmpty()) {
            if (isRoot) {
                return "C01";
            }else {
                return "C00";
            }
        }

        return deptCodes.stream().filter(code -> code != null && !code.isEmpty() && containsDigit(code)).toList().get(0);
    }

    /**
     * 检查字符串中是否包含数字
     *
     * @param str 输入字符串
     * @return 是否包含数字
     */
    private static boolean containsDigit(String str) {
        for (char c : str.toCharArray()) {
            if (Character.isDigit(c)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 增加部门代码
     *
     * @param code 当前最大代码
     * @return 增加后的代码
     */
    public static String incrementCode(String code) {
        // 假设代码格式为 "A01" 或 "A02A01" 等
        int lastIndex = code.length() - 1;
        while (Character.isDigit(code.charAt(lastIndex))) {
            lastIndex--;
        }
        String prefix = code.substring(0, lastIndex + 1);
        String numberPart = code.substring(lastIndex + 1);
        int number = Integer.parseInt(numberPart);
        number++;
        return prefix + String.format("%02d", number);
    }

    public static void main(String[] args) {
        // 测试用例
        String input = "国会监管场所";
        String output = toPinyinAbbreviation(input);
        System.out.println(output);

        input = "测试-门户过货商001";
        output = toPinyinAbbreviation(input);
        System.out.println(output);

        input = "苏州载唐科技有限公司（GYS）";
        output = toPinyinAbbreviation(input);
        System.out.println(output);

        input = "MD IRON TRED有限责任公司";
        output = toPinyinAbbreviation(input);
        System.out.println(output);

        input = "测试001-承运单位国";
        output = toPinyinAbbreviation(input);
        System.out.println(output);

        // 测试用例
        List<String> deptCodes = List.of("YOULAI", "B61", "B60", "B59", "B58", "B57", "B56", "A63", "A60");
        String filtered = filterDeptCodes(deptCodes, true);
        System.out.println(filtered);

        String incremented = incrementCode("A01");
        System.out.println("incrementCode = " + incremented);

        String incrementCode = incrementCode("A02A03");
        System.out.println("incrementCode = " + incrementCode);
    }
}
